#ifndef STATEINFO_H
#define STATEINFO_H

#include <QString>
#include <vector>

/**
 * @brief ASDU信息
 */
struct ASDUInfo
{
    int asdu_addr;
    QString device_name;
    /**
     * @brief ASDU类型
     */
    enum Type
    {
        YX,
        YC,
        YK,
        SD,
        DD
    } asdu_type;
};

struct PointInfo
{
    int station_id;
    int point_id;               ///< 点地址，TODO: 需要修改为point_address
    int relation_point_address; ///< 关联点地址, 只有遥控和遥调才有关联点地址
    QString point_desc;
    enum Type
    {
        YX,
        YC,
        DD,
        YK,
        YT,
        SOE
    } point_type;
    int direction;
};

/**
 * @brief 变电站结构体
 */
class StateInfo
{
public:
    /**
     * @brief 点表地址配置
     */
    struct PointSetting
    {
        uint64_t yx_addr_start;
        uint64_t yc_addr_start;
        uint64_t dd_addr_start;
        uint64_t yk_addr_start;
        uint64_t yt_addr_start;
        uint64_t soe_addr_start;
    };
    /**
     * @brief 构造函数
     *
     * @param state_name 状态名称
     * @param description 描述
     * @param host 主机
     */
    explicit StateInfo(int64_t id = 0, int64_t parent_id = 0, QString state_name = "", QString description = "", QString host = "0.0.0.0", int port = 2404);

    /**
     * @brief 析构函数
     */
    virtual ~StateInfo();

    /**
     * @brief 获取ID
     *
     * @return ID
     */
    int64_t id() const;

    /**
     * @brief 设置ID
     *
     * @param id ID
     */
    void setId(int64_t id);

    /**
     * @brief 获取父ID
     *
     * @return 父ID
     */
    int64_t parentId() const;

    /**
     * @brief 设置父ID
     *
     * @param parent_id 父ID
     */
    void setParentId(int64_t parent_id);

    /**
     * @brief 添加ASDU信息
     *
     * @param asdu_addr ASDU地址
     * @param device_name 设备名称
     * @param type_i ASDU类型
     * @return ASDU信息在asdu_vec_中的索引
     */
    int appendASDU(int asdu_addr, QString device_name, int type_i);

    /**
     *
     */
    void setStateName(const QString &name);

    /**
     * @brief 获取变电站名称
     *
     * @return 变电站名称
     */
    QString stateName() const;

    void setDescription(const QString &desc);
    /**
     * @brief 获取变电站描述
     *
     * @return 变电站描述
     */
    QString description() const;

    void setHost(const QString &host);
    /**
     * @brief 获取变电站主机
     *
     * @return 变电站主机
     */
    QString host() const;

    /**
     * @brief 获取ASDU信息
     *
     * @param index ASDU信息在asdu_vec_中的索引
     * @return ASDU信息
     */
    ASDUInfo asdu(int index) const;

    /**
     * @brief 获取端口号
     *
     * @return 端口号
     */
    int port() const;

    /**
     * @brief 设置端口号
     *
     * @param port 端口号
     */
    void setPort(int port);

    /**
     * @brief 设置是否为RTU
     *
     * @param is_rtu 是否为RTU
     */
    void setIsRtu(bool is_rtu);

    /**
     * @brief 获取是否为RTU
     *
     * @return 是否为RTU
     */
    bool isRtu() const;

    /**
     * @brief 将状态信息转换为JSON格式
     *
     * @return JSON格式的字符串
     */
    QString toJson() const;

    /**
     * @brief 获取所有点
     *
     * @return 所有点
     */
    std::vector<PointInfo> points() const;

    /**
     * @brief 设置点
     *
     * @param point_vec 点
     */
    void setPointVec(const std::vector<PointInfo> &point_vec);

    /**
     * @brief 设置是否删除
     *
     * @param is_deleted 是否删除
     */
    void setDeletedFlag(bool is_deleted);

    /**
     * @brief 获取是否删除
     *
     * @return 是否删除
     */
    bool isDeleted() const;

    /**
     * @brief 获取点表地址配置
     *
     * @return 点表地址配置
     */
    PointSetting pointSetting() const;

    /**
     * @brief 设置点表地址配置
     *
     * @param point_setting 点表地址配置
     */
    void setPointSetting(const PointSetting &point_setting);

private:
    int64_t id_;
    int64_t parent_id_;
    QString state_name_;
    QString description_;
    QString host_;
    int port_;
    bool is_rtu_;
    std::vector<ASDUInfo> asdu_vec_;
    std::vector<PointInfo> point_vec_;
    bool is_deleted_;
    PointSetting point_setting_;
};

#endif // STATEINFO_H
